package at.spengergasse.dao.derby;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.sql.Connection;
import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;

import at.spengergasse.dao.MitarbeiterDao;
import at.spengergasse.dao.util.JDBCConnectionController;
import at.spengergasse.model.Mitarbeiter;

public class MitarbeiterDaoDerbyImplTest
{

	private static Connection connection;
	private static MitarbeiterDao dao;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception
	{
		connection = JDBCConnectionController.getConnection();
		dao = new MitarbeiterDaoDerbyImpl();
	}

	@Test
	public void testInsertStmt()
	{
		Mitarbeiter m = new Mitarbeiter(null, "Josef", "geheim01");
		int numberOfRecords = dao.save(connection, m);
		System.out.println(numberOfRecords);
		assertEquals(1, numberOfRecords);
		assertNotNull(m.getId());
		List<Mitarbeiter> mitarbeiter = dao.findAll(connection);
		assertEquals(3, mitarbeiter.size());
	}

	@Test
	public void testSaveExisting()
	{
		Mitarbeiter existingM = dao.findById(connection, Long.valueOf(1));
		System.out.println(existingM.getName());
		existingM.setName("newName");
		System.out.println(existingM.getName());
		dao.save(connection, existingM);
		Mitarbeiter checkM = dao.findById(connection, Long.valueOf(1));
		System.out.println(checkM.getName());
		assertEquals("newName", checkM.getName());
	}

	@Test
	public void testDelete()
	{
		dao.save(connection,
				new Mitarbeiter(null, "testMitarbeiter", "testPWD"));
		List<Mitarbeiter> listM = dao.findAll(connection);
		assertEquals(4, listM.size());
		Mitarbeiter mitarbeiter = listM.get(2);
		dao.delete(connection, mitarbeiter);
		List<Mitarbeiter> rereadM = dao.findAll(connection);
		assertEquals(3, rereadM.size());
	}

	@Test
	public void testFindById()
	{
		Mitarbeiter m = dao.findById(connection, Long.valueOf(2));
		assertEquals("Tim", m.getName());
		assertEquals("abcd3210", m.getPasswort());
	}

	@Test
	public void testFindByIdWithNonExistingId()
	{
		Mitarbeiter m = dao.findById(connection, Long.valueOf(999));
		assertNull(m);
	}

	@Test
	public void testFindAll()
	{
		List<Mitarbeiter> listM = dao.findAll(connection);
		assertEquals(3, listM.size());
		assertEquals("newName", listM.get(0).getName());
	}

	@Test
	public void testFindByName()
	{
		List<Mitarbeiter> listM = dao.findByName(connection, "Tim");
		assertEquals(1, listM.size());
		assertEquals("Tim", listM.get(0).getName());
		assertEquals("abcd3210", listM.get(0).getPasswort());
	}

}
